import logging
import os
import sys
from logging.handlers import TimedRotatingFileHandler


def create_logger(name, log_level="INFO", log_file=None, enable_file_logging=True):
	"""
	创建并配置日志记录器

	:param name: 日志记录器名称
	:param log_level: 日志级别 (DEBUG, INFO, WARNING, ERROR, CRITICAL)
	:param log_file: 日志文件路径 (None表示使用默认路径)
	:param enable_file_logging: 是否启用文件日志 (默认True)
	:return: 配置好的日志记录器
	"""
	logger = logging.getLogger(name)

	# 避免重复添加handler
	if logger.handlers:
		return logger

	logger.setLevel(log_level)
	logger.propagate = False  # 防止日志向上传播导致重复输出

	# 统一的日志格式
	log_format = '%(asctime)s - %(name)s - %(levelname)s - [%(filename)s:%(lineno)d] - %(message)s'
	date_format = '%Y-%m-%d %H:%M:%S'

	# 创建控制台处理器
	console_handler = logging.StreamHandler()
	console_handler.setLevel(log_level)
	console_formatter = logging.Formatter(log_format, datefmt=date_format)
	console_handler.setFormatter(console_formatter)
	logger.addHandler(console_handler)

	# 创建文件处理器
	if enable_file_logging:
		# 如果未指定日志文件路径，使用默认路径
		if log_file is None:
			# 获取项目根目录
			project_root = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
			log_dir = os.path.join(project_root, 'logs')

			# 确保日志目录存在
			os.makedirs(log_dir, exist_ok=True)

			# 统一的日志文件名：app.log
			log_file = os.path.join(log_dir, 'app.log')
		else:
			# 确保日志目录存在
			log_dir = os.path.dirname(log_file)
			if log_dir:
				os.makedirs(log_dir, exist_ok=True)

		try:
			# Windows系统下使用特殊处理避免文件被占用
			if sys.platform == 'win32':
				# 在Windows上使用普通的FileHandler + 手动日志轮转
				# 或者使用RotatingFileHandler而不是TimedRotatingFileHandler
				from logging.handlers import RotatingFileHandler
				# 按大小轮转，而不是按时间，避免Windows文件重命名问题
				file_handler = RotatingFileHandler(
					log_file,
					maxBytes=10 * 1024 * 1024,  # 10MB
					backupCount=30,
					encoding='utf-8'
				)
				logger.info(f"日志文件路径: {log_file}")
			else:
				# Linux/Unix系统使用TimedRotatingFileHandler
				file_handler = TimedRotatingFileHandler(
					log_file,
					when='midnight',  # 每天午夜轮转
					interval=1,  # 每1天
					backupCount=30,  # 保留30天
					encoding='utf-8'
				)
				# 设置轮转后的文件名后缀格式
				file_handler.suffix = "%Y%m%d"  # 例如：app.log.20251015
				logger.info(f"日志文件路径: {log_file}")

			file_handler.setLevel(log_level)
			file_formatter = logging.Formatter(log_format, datefmt=date_format)
			file_handler.setFormatter(file_formatter)
			logger.addHandler(file_handler)

		except Exception as e:
			# 如果文件处理器创建失败，只使用控制台输出
			logger.warning(f"无法创建日志文件处理器: {e}，将只输出到控制台")

	return logger
